//
//  ViewController.m
//  UI27-Block
//
//  Created by 韩旭 on 16/8/19.
//  Copyright © 2016年 lanou. All rights reserved.
//

#import "ViewController.h"
#import "SecondViewController.h"
//写在属性的写法
typedef int (^xxxbloc)(void);
@interface ViewController ()
@property (retain, nonatomic) IBOutlet UILabel *textLable;
@property (nonatomic, copy) void (^xxxbloc)(void);
//block 写在方法中
- (void)handleData:(void (^)(void))string;
@end
@implementation ViewController

- (void)handleData:(void (^)(void))string {
    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        string();
    }];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
    //    block ?  消息传递机制之一
    
    //    block 与 函数相似，有固定功能的代码段
    //    2. block 基本语法
    //    int a;
    //    1> block 声明
    //    void（^)(void）类型 变量名 block
    void(^block)(void);
    //    2> block的赋值
    //    返回值得类型（^block名）（参数列表）
    //    block变量 = ^(参数列表) {固定的代码段 ；}
    block = ^ {
    };
    //    3. block 的几种形式
    //    有参有返回值
    int (^block1)(int);
    block1 = ^(int a) {
        self.view.backgroundColor = [UIColor blackColor];
        return a;
    };
    //    无参数有返回值
    int(^block2)(void) = ^ {
        return 1;
    };
    //    有参数无返回值
    void(^block3)(int c);
    block3 = ^(int c) {
    };
    //    无参数无返回值
    //    无参数无返回值最简单的写法
    void(^block4)() = ^ {
    };
    //  系统提供的代码段可以直接使用
    //    inlineBlock
    //    void(^block6)(<#parameterTypes#>) = ^(<#parameters#>) {
    //        <#statements#>
    //    };
    
    //    4、 block的调用
    //    5. 系统中的block
    //    1. 模态 void (^ __nullable)(void))completion
    //    2. GCD typedef void (^dispatch_block_t)(void);
    //    dispatch_sync(dispatch_get_main_queue(), ^{
    //
    //
    //    });
    //    3. 系统网络请求 (void (^)(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error))completionHandler;
    //    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:];
    //    [self presentViewController:[[ViewController alloc] init] animated:YES completion:^{
    //    }];
    block3(3);
    block1(2);
    
    //    关于带参数的 6.block写在属性和方法上
    self.xxxbloc = block4;
    //    6属性block修饰符使用copy
    self.xxxbloc();
    //    带block的方法的调用
    [self handleData:^{
    }];
    //    7. Block 类型修饰符
    //    __block __weak __strong
    //    1> __Block 在ARC和MRC下有区别
    //    ARC下和MRC下都可以
    //    可以在block内部修改外部变量
    //    ARC下不能避免循环引用的问题
    //    MRC下不可以
    int __block a = 0;
    __block int b = 0;
    void (^blockTest)() = ^{
        a = 100;
    };
    //    2.> __weak 弱引用 修饰block外的变量
    //    __weak 只能在ARC下使用，避免block的循环引用
    //    3.> __strong 强引用
}
- (IBAction)push:(id)sender {
    SecondViewController * secondVC = [SecondViewController new];
//    值传递，需要实现block
//    告诉block，该指针弱引用
    SecondViewController * __block weakSecond = secondVC;
    //    值得传递，需要实现block
    secondVC.block = ^(NSString *title) {
        self.textLable.text = title;
//        Block会对其内部的所有对象进行强引用
        weakSecond.view.backgroundColor = [UIColor yellowColor];
    };
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end